繼連續兩天的 map 跟 set,今天來談 Symbol
Symbol 有以下幾個特點
Object.keys()
, Object.entries()
, for..in
都看不到 Symbol於 js 中建立 Symbol 的語法是 Symbol()
務必不要寫成 new Symbol()
Symbol 有唯一性,即使用相同敘述建立的 Symbol 也不會相等
let sym = Symbol("name");
console.log(sym === Symbol("name")); // false
class Rabbit{
constructor(type){
this.type = type;
}
speak(line) {
console.log(`${this.type} rabbit says '${line}'`);
}
}
let secretName = Symbol("secretName");
let blackRabbit = new Rabbit('black');
blackRabbit[secretName] = 'Blackie';
Object.entries(blackRabbit); // ["type" "black"] 看不見 secretName 的值
console.log(blackRabbit[secretName]); // 'Blackie' 要知道確切的 Symbol 才能 access value
let secretRole = Symbol("secretRole");
// symbol 也可以作為方法的 property name
blackRabbit[secretRole] = function () {
alert("I'm a killer rabbit!");
};
blackRabbit[secretRole](); // call method with property symbol
Object.getOwnPropertySymbols(nameOfObject)
可取得 object 上的 symbol property
預設上物件沒有 symbol property,因此會是 empty array
console.log(Object.getOwnPropertySymbols(blackRabbit)); // [Symbol(name), Symbol(secretRole)]